package open.tech.dawn.rest.module.system.service.impl;

import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import open.tech.dawn.core.error.ServiceException;
import open.tech.dawn.jdbc.SuperServiceImpl;
import open.tech.dawn.rest.module.system.entity.SysConfigDto;
import open.tech.dawn.rest.module.system.mapper.SysConfigMapper;
import open.tech.dawn.rest.module.system.model.SysConfig;
import open.tech.dawn.rest.module.system.query.ConfigQuery;
import open.tech.dawn.rest.module.system.service.ISysConfigService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * <p>
 * 系统配置表 服务实现类
 * </p>
 *
 * @author joss
 * @since 2020-02-02
 */
@Service
public class SysConfigServiceImpl extends SuperServiceImpl<SysConfigMapper, SysConfig> implements ISysConfigService {

    /**
     * 缓存
     */
    private Map<String, SysConfig> cache = new ConcurrentHashMap<>();

    @Override
    public Page<SysConfig> queryPage(Page<SysConfig> page, ConfigQuery query) {
        List<SysConfig> sysConfigs = baseMapper.queryPage(page, query);
        page.setRecords(sysConfigs);
        return page;
    }

    @Override
    public SysConfig queryByCode(String code) {
        if (cache.containsKey(code)) {
            return cache.get(code);
        }
        SysConfig sysConfig = new SysConfig();
        sysConfig.setCode(code);
        sysConfig = getOne(new QueryWrapper<>(sysConfig));
        if (sysConfig == null) {
            log.error("请检查系统配置中是否配置:" + code + "编码的数据!");
            return null;
        }
        cache.put(code, sysConfig);
        return sysConfig;
    }

    @Override
    @Transactional
    public void update(SysConfigDto sysConfigDto) {
        if (StrUtil.isEmpty(sysConfigDto.getId())) {
            throw new ServiceException("数据异常");
        }
        sysConfigDto.emptyValid();
        SysConfig sysConfig1 = new SysConfig();
        sysConfig1.setId(sysConfigDto.getId());
        sysConfig1.setName(sysConfigDto.getName());
        sysConfig1.setValue(sysConfigDto.getValue());
        boolean b = updateById(sysConfig1);
        if (!b) {
            throw new ServiceException("更新失败");
        }
        //清除缓存
        cache.remove(getById(sysConfigDto.getId()).getCode());
    }

    @Override
    @Transactional
    public void add(SysConfigDto sysConfigDto) {
        sysConfigDto.emptyValid();
        SysConfig sysConfig = new SysConfig();
        sysConfig.setCode(sysConfigDto.getCode());
        sysConfig = getOne(new QueryWrapper<>(sysConfig));
        if (sysConfig != null) {
            throw new ServiceException("编码已存在");
        }
        sysConfig = new SysConfig();
        sysConfig.setCode(sysConfigDto.getCode());
        sysConfig.setName(sysConfigDto.getName());
        sysConfig.setValue(sysConfigDto.getValue());
        boolean save = save(sysConfig);
        if (!save) {
            throw new ServiceException("保存失败");
        }
    }

}
